/**
 * Copyright (C) <2020>  <chen junwen>
 * <p>
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * <p>
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * <p>
 * You should have received a copy of the GNU General Public License along with this program.  If
 * not, see <http://www.gnu.org/licenses/>.
 */
package io.mycat.hbt4;

import io.mycat.DataNode;
import io.mycat.TableHandler;
import io.mycat.metadata.NormalTableHandler;
import io.mycat.router.ShardingTableHandler;

public interface ShardingInfo {
    String getDigest();

    Type getType();

    public enum Type {
        broadCast,
        normal,
        sharding,
        custom

    }

    public static ShardingInfo create(TableHandler tableHandler) {
        switch (tableHandler.getType()) {
            case SHARDING:
                return  new ShardingInfo() {
                    @Override
                    public String getDigest() {
                        String name = ((ShardingTableHandler) tableHandler).function().name();
                        return name;
                    }
                    @Override
                    public Type getType() {
                        return Type.sharding;
                    }
                };
            case GLOBAL:
              return createBroadCast();
            case NORMAL:
              return  new ShardingInfo() {
                  @Override
                  public String getDigest() {
                      DataNode dataNode = ((NormalTableHandler) tableHandler).getDataNode();
                      return dataNode.getTargetName();
                  }
                  @Override
                  public Type getType() {
                      return Type.normal;
                  }
              };
            case CUSTOM:
                return  new ShardingInfo() {
                    @Override
                    public String getDigest() {
                        return null;
                    }
                    @Override
                    public Type getType() {
                        return Type.custom;
                    }
                };
        }
        return new ShardingInfo() {
            @Override
            public String getDigest() {
                return Type.broadCast.name();
            }

            @Override
            public Type getType() {
                return Type.broadCast;
            }
        };
    }
    public static ShardingInfo createBroadCast() {
        return new ShardingInfo() {
            @Override
            public String getDigest() {
                return Type.broadCast.name();
            }

            @Override
            public Type getType() {
                return Type.broadCast;
            }
        };
    }
}